package funcpackage

import (
	"fmt"
	"log"
	"runtime"
)

// 定义一个加法函数
func add(a, b int) int {
	return a + b
}

// 函数的参数是加法函数
func test1(a int, add func(int, int) int) int {
	// 内部调用的这个函数
	return add(a, 2)
}

func test2(a int) int {
	return func(x, y int) int { return x + y }(a, 2)
}

// 无参数的函数
func add1() func(a int) int {
	return func(a int) int { return a + 2 }
}

// 有参数的函数
func add2(b int) func(a int) int {
	return func(a int) int { return a + b }
}

func test3() {
	f1 := add1()
	f2 := add2(10)

	res1 := f1(20)
	res2 := f2(20)

	fmt.Println(res1, " ", res2)
}

func f() func(int) int {
	x := 0
	return func(a int) int {
		x += a
		return x
	}
}

func test4() {
	t := f()

	fmt.Println(t(10))
	fmt.Println(t(20))
	fmt.Println(t(30))
}

func factory(str1 string) func(str2 string) string {
	return func(str2 string) string {
		return str2 + str1
	}
}

func test5() {
	func1 := factory(".jpg")
	func2 := factory(".bmp")

	fmt.Println(func1("11111"))
	fmt.Println(func2("22222"))
}

func test6() {
	where := func() {
		_, file, line, _ := runtime.Caller(1)
		log.Println(file, line)
	}

	where()

	a := 10

	b := 20
	where()

	fmt.Println(a, b)

	fmt.Println(a, b+a)

	where()
}

// Test 外层函数调用时，传递参数也要传这个函数
func Test() {
	test6()
}
